OktaからIAM Identity CenterにIDを自動でプロビジョニングしてみた - Workflows編

OktaからIAM Identity CenterにIDを自動でプロビジョニングしてみた - Workflows編

Clock Icon2024.12.21

こんにちは、ゲームソリューション部/業務効率化ソリューション部の新屋です。

本ブログはClassmethod ゲーソル・ギョーソル Advent Calendar 2024の21日目のブログとなります。

https://dev.classmethod.jp/referencecat/gamesol-businesssol-advent-calendar-2024/

https://qiita.com/advent-calendar/2024/gamesol-businesssol

さて今日は「OktaのアイデンティティをAWS IAM Identity Centerに自動プロビジョニングする方法について」…は先日紹介しました。

https://dev.classmethod.jp/articles/okta-lifecycle-management-iam-identity-center-id/

今日はOktaからAWS IAM Identity Centerにプロビジョニングする別のアプローチをご紹介します。題して「OktaからIAM Identity CenterにIDを自動でプロビジョニングしてみた - Workflows編」です。

前提

  • AWS IAM Identity CenterとOktaが統合され、AWSアカウントにシングルサインオンができる状態
  • IAM Identity CenterのSCIM連携を無効化している状態
    • 有効化しているとSCIM連携先からのユーザー作成しかできません

モチベーション

  • 先日紹介したLifecycle Managementによるプロビジョニングは、プロビジョニング先がSCIMに対応していることが前提となるので、SCIM非対応のサービスと連携したい。
  • さらにLifecycle Managementは有償のライセンスなので、これから紹介するWorkflowsの無料枠内で擬似的な自動プロビジョニングを構成したい。

https://www.okta.com/jp/pricing/#it-lifecycle-management

達成するシナリオ

  • Oktaのユーザーを作成し、そのユーザーをAWS IAM Identity Centerに割り当てると、AWS IAM Identity Center側のユーザーが自動で作成され、シングルサインオンができるようになる

okta-iam-identity-center-id-workflows_27

実装および設定手順

(AWS)IAM Identity Centerのユーザーを作成するLambda関数を作成・設定する

import boto3
import uuid
import os
import json

def lambda_handler(event, context):

    identitystore = boto3.client('identitystore')

    instance_id = os.environ.get('IDENTITY_CENTER_INSTANCE_ID')
    if not instance_id:
        return {
            'statusCode': 400,
            'body': 'Error: IDENTITY_CENTER_INSTANCE_ID environment variable is not set.'
        }

    try:
        user_data = event
        if not user_data:
            return {
                'statusCode': 400,
                'body': 'Error: Request payload is empty.'
            }
    except Exception as e:
        return {
            'statusCode': 400,
            'body': f'Error: Invalid payload format: {e}'
        }

    if not all(key in user_data for key in ['UserName', 'DisplayName', 'GivenName', 'FamilyName', 'Emails']):
        return {
            'statusCode': 400,
            'body': 'Error: Missing required user information in request payload.'
        }

    try:
        response = identitystore.create_user(
            IdentityStoreId=instance_id,
            UserName=user_data['UserName'],
            DisplayName=user_data['DisplayName'],
            Name={
                'GivenName': user_data['GivenName'],
                'FamilyName': user_data['FamilyName']
            },
            Emails=user_data['Emails']
        )

        print(f"User created successfully: {response}")

        user_id = response['UserId']
        print(f"Created user ID: {user_id}")

        user_info = identitystore.describe_user(
            IdentityStoreId=instance_id,
            UserId=user_id
        )
        print(f"User info: {user_info}")

        return {
            'statusCode': 200,
            'body': f'User created successfully. User ID: {user_id}'
        }

    except Exception as e:
        print(f"Error creating user: {e}")
        return {
            'statusCode': 500,
            'body': f'Error creating user: {e}'
        }

ロールのポリシーには、IAM Identity Centerのユーザーを操作できる権限を追加してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "identitystore:CreateUser"
            ],
            "Resource": "arn:aws:identitystore::{account_id}:identitystore/d_{instance_id}"
        },
        {
            "Effect": "Allow",
            "Action": [
                "identitystore:DescribeUser",
                "identitystore:ListUsers"
            ],
            "Resource": [
		            "arn:aws:identitystore::{account_id}:identitystore/d_{instance_id}",
		            "arn:aws:identitystore:::user/*"
            ]
        }
    ]
}

環境変数は、以下を設定しましょう。

IDENTITY_CENTER_INSTANCE_ID=d_{instance_id}

各変数はIAM Identity Centerの設定から確認してください。

okta-iam-identity-center-id-workflows_1

(AWS)Okta側からLambda呼び出しで使用するIAM Userを作成する

最後にIAM Userのアクセスキーを作成、取得しておきます。これはOkta側からLambdaを呼び出すユーザーとなるので、必要以上の権限を与えないよう注意が必要です。

(Okta)Workflowsを開始する

管理画面のメニューからWorkflowsコンソールを開きます。

okta-iam-identity-center-id-workflows_2

新しいFlowを作成します。

okta-iam-identity-center-id-workflows_3

(Okta)このWorkflowが、ユーザーをOktaのIAM Identity Centerアプリケーションに割り当てたときに起動するように設定する

Add event で Okta > User Assigned to Application を選択します。

okta-iam-identity-center-id-workflows_4

Connectionを入力します。

okta-iam-identity-center-id-workflows_5

コネクション情報は管理画面 > アプリケーション > Okta Workflows OAuth > 認証 から確認します。

okta-iam-identity-center-id-workflows_6

Domain名はテナントのドメイン名です。URLを参照しましょう。

httpsや-adminは取り除いてください、この場合は demo-teal-emu-xxxxxxxxxx.okta.com です。

okta-iam-identity-center-id-workflows_7

そうすると、User Assigned to Application カードを設定できるようになります。

okta-iam-identity-center-id-workflows_8

(Okta)IAM Identity Centerに送るユーザー情報を取得する

次に Add app action から Okta > Read User カードを設定します。

okta-iam-identity-center-id-workflows_9

そうしたらカード同士をつなぎます。こんな感じです。

okta-iam-identity-center-id-workflows_10

(Okta)Lambda関数を実行する設定をする

Add app actionから AWS Lambda > Invoke を選択し、コネクションを設定します。

okta-iam-identity-center-id-workflows_11

Access KeyとAccess Secretは、先ほど作成したIAM Userの情報を入れてください。RegionはLambda関数を作成したリージョンを選択します。

Invoke Functionは、先ほど作成した関数を選択します。

okta-iam-identity-center-id-workflows_12

(Okta)Lambda関数のペイロードに渡すユーザー情報を整形する

カード追加から 電卓マーク > Object > Construct を選択します。

okta-iam-identity-center-id-workflows_13

カードの設定はこんな感じです。

Key名は変更できまして、IAM Identity Centerのユーザー作成に必要なKey名にしておく必要があります。ValueとPrimaryと変更しておきましょう。

Primaryは常にTrueに設定してください。

okta-iam-identity-center-id-workflows_14

完成はこんな感じ

okta-iam-identity-center-id-workflows_15

またカードを追加します。List >Construct を選択します。

okta-iam-identity-center-id-workflows_16

もうひとつ、Object Constructカードを作成します。

Key名は、UserName, DisplayName, GivenName, FamilyName, Emailsです。

okta-iam-identity-center-id-workflows_17

そうしたら、カードをつないでいきます。

okta-iam-identity-center-id-workflows_18

okta-iam-identity-center-id-workflows_19

okta-iam-identity-center-id-workflows_20

ちなみにRead User の UsernameはEmailの形式である前提です。

OktaはデフォルトではUsernameはEmail形式です。

全体像はこんな感じです。

okta-iam-identity-center-id-workflows_21

これでSave&Flow is ONにしてください。

okta-iam-identity-center-id-workflows_22

動作確認

IAM Identity Centerのユーザー割り当てを行いましょう。

okta-iam-identity-center-id-workflows_23

割り当てたら、IAM Identity Centerにユーザーが出来ていることを確認します。

okta-iam-identity-center-id-workflows_24

最後にシングルサインオンできるかチェックします。

okta-iam-identity-center-id-workflows_25

AWSアクセスポータルにサインインできました。

okta-iam-identity-center-id-workflows_26

さいごに

Workflowでこのような自動化ができ、実装次第でいろいろなオペレーションを柔軟に自動化できます。手間が掛かりますが、Lifecycle Managementが使えない状況だと有効な手段ではないでしょうか。

以上です。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.